home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Night Owl 6
/
Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso
/
016a
/
gofer221.zip
/
APPX_A
< prev
next >
Wrap
Text File
|
1991-11-20
|
10KB
|
265 lines
Introduction to Gofer APPENDIX A: SUMMARY OF GRAMMAR
APPENDIX A: SUMMARY OF GRAMMAR
This section gives a summary of the grammar for the language used by
Gofer. The non-terminals <interp> and <module> describe the syntax of
expressions that can be entered into the Gofer interpreter and that of
files of definitions that can be loaded into Gofer respectively.
The following notational conventions are used in the Grammar which is
specified using a variant of BNF:
o <angle brackets> are used to distinguish names of nonterminals from
keywords.
o vertical | bars are used to separate alternatives.
o {braces} enclose items which may be repeated zero or more times.
o [brackets] are used for optional items.
o (parentheses) are used for grouping.
o "quotes" surround characters which might otherwise be confused with
the notations introduced above.
The following terminal symbols are used but not defined by the grammar:
VARID identifier beginning with lower case letter as described in
section 6.
CONID like VARID, but beginning with upper case letter.
VAROP operator symbol not beginning with a colon, as described in
section 6.
CONOP constructor function operator, like VAROP, but beginning
with a colon character.
INTEGER integer constant, as described in section 7.3.
FLOAT floating point constant, as described in section 7.4.
CHAR character constant, as described in section 7.5.
STRING string constant, as described in section 7.7.
Top-level grammar
-----------------
<module> ::= "{" <topdecls> "}" module
<interp> ::= <exp> [<where>] top-level expression
<topdecls> ::= <topdecls>; <topdecls> multiple declarations
| data <typeLhs> = <constrs> datatype declaration
| type <typeLhs> = <type> synonym declaration
| infixl [<digit>] <op> {, <op>} fixity declarations
| infixr [<digit>] <op> {, <op>}
| infix [<digit>] <op> {, <op>}
| primitive <prims> :: <type> primitive bindings
| <class> class declaration
| <inst> instance declaration
| <decls> value declarations
93
Introduction to Gofer APPENDIX A: SUMMARY OF GRAMMAR
<typeLhs> ::= CONID {VARID} type declaration lhs
<constrs> ::= <constrs> "|" <constrs> multiple constructors
| <type> CONOP <type> infix constructor
| CONID {<type>} constructor, n>=0
<prims> ::= <prims>, <prims> multiple bindings
| <var> <string> primitive binding
Type expressions
----------------
<sigType> ::= [<context> => ] <type> [qualified] type
<context> ::= "(" [<pred> {, <pred>}] ")" general form
| <pred> singleton context
<pred> ::= CONID <type> {<type>} predicate
<type> ::= <ctype> [ -> <type> ] function type
<ctype> ::= CONID {<atype>} datatype or synonym
| <atype>
<atype> ::= VARID type variable
| "(" ")" unit type
| "(" <type> ")" parenthesised type
| "(" <type>,<type> {,<type>} ")" tuple type
| "[" <type> "]" list type
Class and instance declarations
-------------------------------
<class> ::= class [<context> =>] <pred> [<cbody>]
<cbody> ::= where "{" <cdecls> "}" class body
<cdecls> ::= <cdecls>; <cdecls> multiple declarations
| <var> {, <var>} :: <type> member functions
| <fun> <rhs> [<where>] default bindings
<inst> ::= inst [<context> =>] <pred> [<ibody>]
<ibody> ::= where "{" <idecls> "}" instance body
<idecls> ::= <idecls>; <idecls> multiple declarations
| <fun> <rhs> [<where>] member definition
Value declarations
------------------
<decls> ::= <decls>; <decls> multiple declarations
| <var> {, <var>} :: <sigType> type declaration
| <fun> <rhs> [<where>] function binding
| <pat> <rhs> [<where>] pattern binding
<rhs> ::= = <exp> simple right hand side
| <gdRhs> {<gdRhs>} guarded right hand sides
<gdRhs> ::= "|" <exp> = <exp> guarded right hand side
<where> ::= where "{" <decls> "}" local definitions
94
Introduction to Gofer APPENDIX A: SUMMARY OF GRAMMAR
<fun> ::= <var> function of arity 0
| <pat> <varop> <pat> infix operator
| "(" <pat> <varop> ")" section-like notation
| "(" <varop> <pat> ")"
| <fun> <apat> function with argument
| "(" <fun> ")" parenthesised lhs
Expressions
-----------
<exp> ::= \ <apat> {<apat>} -> <exp> lambda expression
| let "{" <decls> "}" in <exp> local definition
| if <exp> then <exp> else <exp> conditional expression
| case <exp> of "{" <alts> "}" case expression
| <opExp> :: <sigType> typed expression
| <opExp>
<opExp> ::= <opExp> <op> <opExp> operator application
| <pfxExp>
<pfxExp> ::= - <appExp> negation
| <appExp>
<appExp> ::= <appExp> <atomic> function application
| <atomic>
<atomic> ::= <var> variable
| <conid> constructor
| INTEGER integer literal
| FLOAT floating point literal
| CHAR character literal
| STRING string literal
| "(" ")" unit element
| "(" <exp> ")" parenthesised expr.
| (<exp> <op>) sections
| (<op> <exp>)
| "[" <list> "]" list expression
| "(" <exp>, <exp> {, <exp>} ")" tuple
<list> ::= [ <exp> {, <exp>} ] enumerated list
| <exp> "|" <quals> list comprehension
| <exp> .. arithmetic sequence
| <exp, <exp> ..
| <exp> .. <exp>
| <exp>, <exp> .. <exp>
<quals> ::= <quals>, <quals> multiple qualifiers
| <pat> <- <exp> generator
| <pat> = <exp> local definition
| <exp> boolean guard
<alts> ::= <alts>, <alts> multiple alternatives
| <pat> <altRhs> [<where>] alternative
<altRhs> ::= -> <exp> single alternative
| <gdAlt> {<gdAlt>} guarded alternatives
<gdAlt> ::= "|" <exp> -> <exp> guarded alternative
Patterns
--------
<pat> ::= <pat> <conop> <pat> operator application
95
Introduction to Gofer APPENDIX A: SUMMARY OF GRAMMAR
| <var> + <integer> (n+k) pattern
| <appPat>
<appPat> ::= <appPat> <apat> application
| <apat>
<apat> ::= <var> variable
| <var> @ <pat> as pattern
| ~ <pat> irrefutable pattern
| _ wildcard
| <conid> constructor
| INTEGER integer literal
| CHAR character literal
| STRING string literal
| "(" ")" unit element
| "(" <pat> ")" parenthesised expr.
| (<pat> <conop>) sections
| (<conop> <pat>)
| "[" [ <pat> {, <pat>} ] "]" list
| "(" <pat>, <pat> {, <pat>} ")" tuple
Variables and operators
-----------------------
<var> ::= <varid> | "(" - ")" variable
<op> ::= <varop> | <conop> | - operator
<varid> ::= VARID | "(" VAROP ")" variable identifier
<varop> ::= VAROP | ` VARID ` variable operator
<conid> ::= CONID | "(" CONOP ")" constructor identifier
<conop> ::= CONOP | ` CONID ` constructor operator
96